package net.schastny.shopmanager.dao;

import java.util.List;

import net.schastny.shopmanager.domain.Contact;
import net.schastny.shopmanager.domain.Parsel;
import net.schastny.shopmanager.dao.ParselDAO;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;


/* Repository - Аннотация показывает, что класс функционирует как репозиторий и 
 * требует наличия прозрачной трансляции исключений. Преимуществом трансляции 
 * исключений является то, что слой сервиса будет иметь дело с общей иерархией 
 * исключений от Спринга (DataAccessException) вне зависимости от используемых 
 * технологий доступа к данным в DAO слое.
 */

@Repository
public class ParselDAOImpl implements ParselDAO {
	/*Аннотация позволяет автоматически установить значение поля SessionFactory.
	 */
	@Autowired
	private SessionFactory sessionFactory;
	
	public void addParsel(Parsel parsel) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().save(parsel);
	}
	
	@SuppressWarnings("unchecked")
	public List<Parsel> listParsel() {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().createQuery("from Parsel")
	            .list();
	}

	public void removeParsel(Integer id) {
		// TODO Auto-generated method stub
		Parsel parsel = (Parsel) sessionFactory.getCurrentSession().load(
				Parsel.class, id);
        if (null != parsel) {
            sessionFactory.getCurrentSession().delete(parsel);
        }
	}

	public void editParsel(Parsel parsel) {
		// TODO Auto-generated method stub
	// TODO Auto-generated method stub
		
		// Retrieve session from Hibernate
		Session session = sessionFactory.getCurrentSession();
		
		// Retrieve existing person via id
		Parsel existingParsel = (Parsel) session.get(Parsel.class,parsel.getParselId());
		System.out.println("existingParsel = "+existingParsel.toString());
		existingParsel.setParselSn(parsel.getParselSn());
		existingParsel.setParselDepartureDate(parsel.getParselDepartureDate());
		if (parsel.getParselArrivalDate() != null && parsel.getParselArrivalDate()!=""){
			existingParsel.setParselArrivalDate(parsel.getParselArrivalDate());}
		if (parsel.getParselDescription() != null && parsel.getParselDescription()!=""){
			existingParsel.setParselDescription(parsel.getParselDescription());}
		
		// Save updates
		session.save(existingParsel);
	}

	public Parsel getParsel(Integer id) {
		// TODO Auto-generated method stub
		return (Parsel) sessionFactory.getCurrentSession().createQuery("FROM Parsel as p WHERE p.parselId="+id).uniqueResult();
	}
	
	
}
